#include<stdio.h>
#include<gmp.h>

int main (void)
{
    mpf_t a, a_old, b , b_old, t, t_old ,p , pi, pi_old;
    int i = 0;

    mpf_set_default_prec(34000000);

    mpf_init_set_ui(a_old, 1);


    mpf_init(a);
    mpf_init(b);
    mpf_init(t);
    mpf_init(p);
    mpf_init_set_ui(pi,0);
    mpf_init_set_ui(pi_old,1);

    mpf_init_set_ui(b_old, 2);
    mpf_sqrt(b_old,b_old);
    mpf_ui_div(b_old, 1 , b_old);


    mpf_init_set_d(t_old, 0.25);

    mpf_init_set_ui(p, 1);


    while(1)
    {
        mpf_set(pi_old, pi);

        mpf_add(a, a_old, b_old);
        mpf_div_ui(a , a , 2);

        mpf_mul(b, a_old, b_old);
        mpf_sqrt(b,b);

        mpf_sub(t, a_old , a);
        mpf_pow_ui(t, t , 2);

        mpf_mul(t, t, p);
        mpf_sub(t, t_old, t);

        mpf_mul_ui(p , p, 2);


        mpf_set(a_old, a);
        mpf_set(b_old, b);
        mpf_set(t_old, t);

        i++;

        mpf_add(pi, a, b);
        mpf_mul(pi, pi, pi);
        mpf_mul_ui(t, t , 4);

        mpf_div(pi, pi, t);

        if(mpf_cmp(pi, pi_old) == 0)
        {
            break;
        }


    }

    gmp_printf("Iteracoes: %d  %.10000000Ff\n\n", i, pi);

    mpf_clear(a);
    mpf_clear( a_old);s
    mpf_clear(b);
    mpf_clear(b_old);
    mpf_clear(t);
    mpf_clear(t_old);
    mpf_clear(p);
    mpf_clear(pi);
    mpf_clear(pi_old);



    return 0;
}
